package io.renren.common.utils;

import java.util.Base64;
import java.nio.charset.StandardCharsets;

import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

public class BaseAesUtil {

    /**
     * 加密方法
     *
     */
    /**
     * AES，Advanced Encryption Standard，即高级数据加密标准。
     * <p>
     * 输入：待加密的字符串，16或24或32位字符串密码
     * 输出：16进制字符串或Base64编码的字符串密文（常用）
     * 应用：密码管理、数字签名、文件完整性校验
     * 安全性：★★★★☆
     *
     * @param plainString 明文
     * @param key         秘钥
     * @return cipherString 密文
     */
    public static String aesEncrypt(String plainString, String key) {
        String cipherString = null;
        try {
            // 指定算法
            String algorithm = "AES";
            // 创建密钥规范
            SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), algorithm);
            // 获取Cipher对象实例（Java8中AES默认使用ECB模式和PKCS5Padding填充方式，因此下列模式和填充方式无需指定）
            Cipher cipher = Cipher.getInstance(algorithm + "/ECB/PKCS5Padding");
            // 初始化Cipher为加密模式
            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
            // 获取加密byte数组
            byte[] cipherBytes = cipher.doFinal(plainString.getBytes(StandardCharsets.UTF_8));
            // 输出为Base64编码
            cipherString = Base64.getEncoder().encodeToString(cipherBytes);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return cipherString;
    }
    /**
     * 解密方法
     *
     * @param sSrc 需要解密的信息
     * @param encodingFormat 编码格式
     * @param sKey 秘钥
     * @param ivParameter iv初始向量
     * @return 解密后的信息
     */
    /**
     * AES，Advanced Encryption Standard，即高级数据加密标准。
     * <p>
     * 输入：密文，16或24或32位字符串密码
     * 输出：明文
     * 应用：密码管理、数字签名、文件完整性校验
     * 安全性：★★★★☆
     *
     * @param cipherString 密文
     * @param key          秘钥
     * @return plainString 明文
     */
    public static String aesDecrypt(String cipherString, String key) {
        String plainString = null;
        try {
            // 指定算法
            String algorithm = "AES";
            // 创建密钥规范
            SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), algorithm);
            // 获取Cipher对象实例（Java8中AES默认使用ECB模式和PKCS5Padding填充方式，因此下列模式和填充方式无需指定）
            Cipher cipher = Cipher.getInstance(algorithm + "/ECB/PKCS5Padding");
            // 初始化Cipher为解密模式
            cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
            // 获取加密byte数组
            byte[] cipherBytes = cipher.doFinal(Base64.getDecoder().decode(cipherString));
            // 输出为字符串
            plainString = new String(cipherBytes);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return plainString;
    }

    /**
     * 防止在linux下随机生成key
     *
     * @throws NoSuchAlgorithmException
     */
    public static void kgenInit(KeyGenerator kgen, byte[] bytes)
            throws NoSuchAlgorithmException {
        //1.防止linux下 随机生成key
        SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
        secureRandom.setSeed(bytes);
        //2.根据密钥初始化密钥生成器
        kgen.init(128, secureRandom);
    }

    public static void main(String[] args) {
        String key = "vbm+05MqNMxV0yHclzEVbA==";
        //String baseStr = "df9bc4a24ddf45aba06a2a57f14ab10b1672348800000";
        String baseStr = "df9bc4a24ddf45aba06a2a57f14ab10b1736493029628";
        String en = aesEncrypt(baseStr, key);
        System.out.println(en);
        System.out.println("de：" + aesDecrypt(en, key));

        System.out.println(aesDecrypt("BvHulVWb+kboiMmLaKF9/I/Qq5dDTr3nXSv2IsSIkM5gNAatlWpn3cCvwp6AaF9+", key));

    }
}
